/*msgsnd.c文件用于向消息队列发送消息*/
#include "msgexamp.h"
#include <stdlib.h>
#include <time.h>  // 为了使用 srand 和 time 函数

int main() {
    int index = 1;  // 用于记录发送消息的次数
    struct my_msg_st some_data;  // 定义一个消息结构体变量，用于存储要发送的消息
    int msgid;  // 消息队列的标识符
    char buffer[BUFSIZ];  // 临时存储用户输入的消息内容

    // 获取消息队列的标识符，如果消息队列不存在则创建
    // IPC_CREAT 表示如果消息队列不存在则创建，S_IRUSR 和 S_IWUSR 分别表示用户有读和写的权限
    msgid = msgget((key_t)MSG_KEY, IPC_CREAT | S_IRUSR | S_IWUSR);
    if (msgid == -1) {
        perror("create message queue failed ");  // 输出错误信息
        return -1;  // 程序失败退出
    }

    // 初始化随机数种子，确保每次运行程序时生成的随机数不同
    srand((int)time(0));

    // 循环发送 4 条消息
    while (index < 5) {
        // 提示用户输入消息内容，并告知消息队列标识符和最大文本长度
        printf("[%d]Enter some text: less than %d\n", msgid, MAX_TEXT);
        // 从标准输入读取用户输入的消息内容
        fgets(buffer, BUFSIZ, stdin);

        // 随机生成消息类型，范围是 1 到 3
        some_data.my_msg_type = rand() % 3 + 1;
        // 输出当前生成的消息类型
        printf("my msg_type=%ld\n", some_data.my_msg_type);

        // 将用户输入的消息内容复制到消息结构体的文本字段中
        strcpy(some_data.text, buffer);

        // 向消息队列发送消息
        if (msgsnd(msgid, (void *)&some_data, sizeof(some_data), 0) == -1) {
            // 如果发送失败，输出错误信息并退出程序
            fprintf(stderr, "msgsnd failed\n");
            exit(-1);
        }

        index++;  // 消息发送次数加 1
    }

    exit(0);  // 程序正常退出
}